package com.dc.config;

import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;

import java.util.List;

@Slf4j
public class CustomTenantLineHandler implements TenantLineHandler {

    /**
     * 用户对应租户信息缓存key
     */
    public static final String TENANT_CASE_KEY = "TENANT_CASE_KEY";

    /**
     * 忽略添加租户ID的表
     */
    private static List<String> IGNORE_TABLE_NAMES = Lists.newArrayList(
            "tenant_info"
    );

    /**
     * 获取租户ID值表达式
     *
     * @return
     */
    @Override
    public Expression getTenantId() {
        //租户Id，可以从缓存或者cookie，token等中获取
        return new LongValue("returnTenantId()");
    }

    /**
     * 获取租户字段名(数据库的租户ID字段名)
     *
     * @return
     */
    @Override
    public String getTenantIdColumn() {
        return "tenant_id";
    }

    /**
     * 根据表名判断是否忽略拼接多租户条件
     *
     * @param tableName
     * @return
     */
    @Override
    public boolean ignoreTable(String tableName) {
        return IGNORE_TABLE_NAMES.contains(tableName);
    }

    /**
     * 从请求中获取到token，从token中解析出tenantId
     *
     * @return
     */
//    public Long returnTenantId() {
//        //初始化值，保存程序正常启动
//        Long tenantId = 1L;
//        //从请求头中获取token
//        try {
//            HttpServletRequest request = HttpServletUtil.getRequest();
//            AuthService authService = SpringUtil.getBean(AuthService.class);
//            String token = authService.getTokenFromRequest(request);
//            //请求头中有token
//            if (StringUtils.isNotEmpty(token)) {
//                JwtPayLoad jwtPayLoad = JwtTokenUtil.getJwtPayLoad(token);
//                tenantId = jwtPayLoad.getTenantId();
//            }
//        } catch (ServiceException exception) {
//            log.info(">>> 没有HTTP服务请求处理方式！");
//            //没有HTTP服务请求处理方式，内部调用处理
//            try {
//                //从security中的认证上下文对象中获取当前登录用户账号，根据账号去redis缓存中匹配出当前操作是属于那个租户ID
//                String account = LoginContextHolder.me().getSysLoginUser().getAccount();
//                if (StringUtils.isNotEmpty(account)) {
//                    RedisTemplate redisTemplate = SpringUtil.getBean("redisTemplate");
//                    Object object = redisTemplate.opsForValue().get(TENANT_CASE_KEY);
//                    String jsonMap = object.toString();
//                    Map accountTenantMapper = JSON.parseObject(jsonMap, Map.class);
//                    tenantId = Long.valueOf(String.valueOf((accountTenantMapper.get(account))));
//                    log.info(">>> 内部调用！用户账号：" + account + " | 所属租户：" + tenantId);
//                }else {
//                    log.info(">>> 必要参数缺失！");
//                }
//            } catch (AuthException e) {
//                log.info(">>> " + e.getMessage());
//            }
//        }
//        return tenantId;
//    }
}
